package com.ktgj.customer.util;

import com.ktgj.common.core.utils.StringUtils;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;

/**
 * @Author:yanxianzhou
 * @Descripyion:
 * @Date:Create in 17:22 2020/5/9
 * @Modificd By:
 */

public class Util {


    public static String getMd5(String msg) {
        try {
            // 加密对象，指定加密方式
            MessageDigest md5 = MessageDigest.getInstance("md5");
            // 准备要加密的数据
            byte[] b = msg.getBytes();
            // 加密
            byte[] digest = md5.digest(b);
            // 十六进制的字符
            char[] chars = new char[]{'0', '1', '2', '3', '4', '5',
                    '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
            StringBuffer sb = new StringBuffer();
            // 处理成十六进制的字符串(通常)
            for (byte bb : digest) {
                sb.append(chars[(bb >> 4) & 15]);
                sb.append(chars[bb & 15]);
            }
            return sb.toString().toLowerCase();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }

        return "";
    }
    public static String md5_utf8(String value){
        String result = null;
        MessageDigest md5 = null;
        try{
            md5 = MessageDigest.getInstance("MD5");
            md5.update((value).getBytes("UTF-8"));
        }catch (NoSuchAlgorithmException error){
            error.printStackTrace();
        }catch (UnsupportedEncodingException e){
            e.printStackTrace();
        }
        byte b[] = md5.digest();
        int i;
        StringBuffer buf = new StringBuffer("");

        for(int offset=0; offset<b.length; offset++){
            i = b[offset];
            if(i<0){
                i+=256;
            }
            if(i<16){
                buf.append("0");
            }
            buf.append(Integer.toHexString(i));
        }

        result = buf.toString();
        return result;
    }


    /**
     * @param dateString 各种日期格式的字符串
     * @param format     默认值为 yyyy-MM-dd HH:mm:ss
     * @return LocalDateTime
     */
    public static LocalDateTime stringToLocalDateTime(String dateString, String format) {
        if (dateString == null || dateString == "") return null;
        if (format == null || format == "") format = "yyyy-MM-dd HH:mm:ss";
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);
        return LocalDateTime.parse(dateString, dateTimeFormatter);
    }

    /**
     * @param dateString 各种日期格式的字符串
     * @param format     默认值为 yyyy-MM-dd HH:mm:ss
     * @return LocalDate
     */
    public static LocalDate stringToLocalDate(String dateString, String format) {
        if (dateString == null || dateString == "") return null;
        if (format == null || format == "") format = "yyyy-MM-dd";
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);
        return LocalDate.parse(dateString, dateTimeFormatter);
    }

    /**
     * @param localDateTime
     * @param format        默认值为 yyyy-MM-dd HH:mm:ss
     * @return 指定日期格式的字符串
     */
    public static String localDateTimeToString(LocalDateTime localDateTime, String format) {
        if (localDateTime == null) return null;
        if (format == null || format == "") format = "yyyy-MM-dd HH:mm:ss";
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);

        return dateTimeFormatter.format(localDateTime);

    }

    /**
     * @param localDate
     * @param format    默认值为 yyyy-MM-dd HH:mm:ss
     * @return 指定日期格式的字符串
     */
    public static String localDateToString(LocalDate localDate, String format) {
        if (localDate == null) return null;
        if (format == null || format == "") format = "yyyy-MM-dd";
        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(format);

        return dateTimeFormatter.format(localDate);

    }
    public static class IDCardUtil {
        /**
         * 15位身份证号
         */
        private static final Integer FIFTEEN_ID_CARD = 15;
        /**
         * 18位身份证号
         */
        private static final Integer EIGHTEEN_ID_CARD = 18;
        private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");

        /**
         * 根据身份证号获取性别
         *
         * @param IDCard
         * @return
         */
        public static String getSex(String IDCard) {
            String sex = "";
            if (StringUtils.isNotBlank(IDCard)) {
                //15位身份证号
                if (IDCard.length() == FIFTEEN_ID_CARD) {
                    if (Integer.parseInt(IDCard.substring(14, 15)) % 2 == 0) {
                        sex = "女";
                    } else {
                        sex = "男";
                    }
                    //18位身份证号
                } else if (IDCard.length() == EIGHTEEN_ID_CARD) {
                    // 判断性别
                    if (Integer.parseInt(IDCard.substring(16).substring(0, 1)) % 2 == 0) {
                        sex = "女";
                    } else {
                        sex = "男";
                    }
                }
            }
            return sex;
        }

        /**
         * 根据身份证号获取年龄
         *
         * @param IDCard
         * @return
         */
        public static Integer getAge(String IDCard) {
            Integer age = 0;
            Date date = new Date();
            if (StringUtils.isNotBlank(IDCard) && isValid(IDCard)) {
                //15位身份证号
                if (IDCard.length() == FIFTEEN_ID_CARD) {
                    // 身份证上的年份(15位身份证为1980年前的)
                    String uyear = "19" + IDCard.substring(6, 8);
                    // 身份证上的月份
                    String uyue = IDCard.substring(8, 10);
                    // 当前年份
                    String fyear = format.format(date).substring(0, 4);
                    // 当前月份
                    String fyue = format.format(date).substring(5, 7);
                    if (Integer.parseInt(uyue) <= Integer.parseInt(fyue)) {
                        age = Integer.parseInt(fyear) - Integer.parseInt(uyear) + 1;
                        // 当前用户还没过生
                    } else {
                        age = Integer.parseInt(fyear) - Integer.parseInt(uyear);
                    }
                    //18位身份证号
                } else if (IDCard.length() == EIGHTEEN_ID_CARD) {
                    // 身份证上的年份
                    String year = IDCard.substring(6).substring(0, 4);
                    // 身份证上的月份
                    String yue = IDCard.substring(10).substring(0, 2);
                    // 当前年份
                    String fyear = format.format(date).substring(0, 4);
                    // 当前月份
                    String fyue = format.format(date).substring(5, 7);
                    // 当前月份大于用户出身的月份表示已过生日
                    if (Integer.parseInt(yue) <= Integer.parseInt(fyue)) {
                        age = Integer.parseInt(fyear) - Integer.parseInt(year) + 1;
                        // 当前用户还没过生日
                    } else {
                        age = Integer.parseInt(fyear) - Integer.parseInt(year);
                    }
                }
            }
            return age;
        }

        /**
         * 获取出生日期  yyyy年MM月dd日
         *
         * @param IDCard
         * @return
         */
        public static String getBirthday(String IDCard) {
            String birthday = "";
            String year = "";
            String month = "";
            String day = "";
            if (StringUtils.isNotBlank(IDCard)) {
                //15位身份证号
                if (IDCard.length() == FIFTEEN_ID_CARD) {
                    // 身份证上的年份(15位身份证为1980年前的)
                    year = "19" + IDCard.substring(6, 8);
                    //身份证上的月份
                    month = IDCard.substring(8, 10);
                    //身份证上的日期
                    day = IDCard.substring(10, 12);
                    //18位身份证号
                } else if (IDCard.length() == EIGHTEEN_ID_CARD) {
                    // 身份证上的年份
                    year = IDCard.substring(6).substring(0, 4);
                    // 身份证上的月份
                    month = IDCard.substring(10).substring(0, 2);
                    //身份证上的日期
                    day = IDCard.substring(12).substring(0, 2);
                }
                birthday = year + "-" + month + "-" + day;
            }
            return birthday;
        }

        /**
         * 身份证验证
         *
         * @param id 号码内容
         * @return 是否有效
         */
        public static boolean isValid(String id) {
            Boolean validResult = true;
            //校验长度只能为15或18
            int len = id.length();
            if (len != FIFTEEN_ID_CARD && len != EIGHTEEN_ID_CARD) {
                validResult = false;
            }
            //校验生日
            if (!validDate(id)) {
                validResult = false;
            }
            return validResult;
        }

        /**
         * 校验生日
         *
         * @param id
         * @return
         */
        private static boolean validDate(String id) {
            try {
                String birth = id.length() == 15 ? "19" + id.substring(6, 12) : id.substring(6, 14);
                SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
                Date birthDate = sdf.parse(birth);
                if (!birth.equals(sdf.format(birthDate))) {
                    return false;
                }
            } catch (ParseException e) {
                return false;
            }
            return true;
        }
    }
}
